# -*- coding: UTF-8 -*-

# create so
# model = 'sale.order'
# Model = rpc.env.model(model)
# Model.create({
#   partner_id: 1,
#   order_line: [(0,0, {product_id:1, price: 100, qty: 2}), (0,0, {}) ]
# })
#
# 前端处理逻辑
# 前端定义变量 value1 和  value2
# {
#    partner_id: 1
#    order_line: []
# }
# value1 作为 绑定到 form 表单的数据
# value2 作为 每次 change 事件，更新的数据
# 这个 form 表单 对应 表头数据 销售订单 so
# 里面嵌入一个  table 表格，显示  value1.order_line 中的数据 即明细行的数据
# 明细行 table 有行点击事件，弹出窗口。在弹窗中 做 一条明细行的 编辑和删除
# 明细行 table 外 放一个按钮，功能是  明细行的新增。点击后 弹窗 。实现 新增行的 数据录入
# 在弹窗中 定义 明细行的 form。处理 明细行的录入
# 在弹窗中，就是一个 简单的  单条数据的 编辑或者新增页面。管理自己的  value1 和 value2 。
# 弹窗中 有 保存按钮，点击 保存按钮。获取 明细行的 value2. 关闭 弹窗。触发表头页面的事件
# 在表头页面中，收到该事件后。获取该条明细行数据。更新到表头的value2,value1 中的 order_line 数组中
# 中间描述的细节, 未提到, 但是不表示不存在:
#    无论表头form 还是明细行form。每个字段的编辑 都有 change 事件，以调用 onchange接口
#
# 换个方式描述这件事
# 弹窗里的明细行 form 是个 独立的form。完成自己的 编辑。change事件。 调用 onchange接口
#  只是 最后提交时，不去 调用接口，而是把数据返回到 表头销售订单页面
# 而表头 销售订单页面的 form 也是 自己的 独立 form 做自己的事。
#  只是 嵌入了一个  明细行的 列表小组件，这个组件包括一个 table 和一个 新增按钮
#  同时表头页面 中。需要接受 明细行弹窗 关闭时 返回的数据，
#  更新到自己的 value1 和 value2 中的 order_line数组中
#  同时强调下, 表头 销售订单 的 order_line 字段的数据发生变化,也需要 调用 销售订单的 onchange
#
# 流程
# 1. 获取最初的数据。
# 1.1 如果是 新增, 则是 调用 onchange. 相当于 default_get
# 1.2 如果是 编辑, 则是 调用 read
# 2. 最初的数据. 转换下格式 写入 value1
# 2.1. 其中  order_line 数据是数组 显示在 table 中
# 3. 表头的 form 页面 做正常的编辑.编辑某个字段, 触发 change事件.
# 3.1 更新 value1 和 value2.
# 3.2 调用 onchange 接口. 返回值更新 value1 和 value2.
# 3.2.1 注意 调用  onchange 接口时的参数。 order_line 字段的数据 组织有特殊要求
# 4. 表头中 点击明细行的新增按钮或者点击某一行。打开 明细行的 弹窗页面
# 5. 在弹窗页面里, 有 明细行的 form。正常做 某字段的编辑。触发 change 事件。调用 onchange 接口
# 5.1 注意 明细行的 onchange 接口的参数中 有父表的数据。组织起来，也很啰嗦。
# 6. 明细行弹窗中，点击保存按钮。触发 事件。通知 父表页面，参数是 value1和2。关闭窗口
# 7. 销售订单页面，收到 弹窗页面的事件。收到 明细行的 value1和2
# 8. 更新自己的 value1和value2 中的 order_line 数据
# 9. 调用 onchange 接口。参数是  order_line 字段的数据改变了。
# 9.1 onchange 结果。更新 value1和value2
# 重复上述步骤, 完成其他字段编辑
# 最后提交保存, create 或者 write 接口. 参数 value2. 其中注意 order_line的数据格式
#
# 相关的几个接口函数
# 1. onchange 接口 获取 默认值
# 2. read 接口 获取 待编辑的数据
# 2.1. order_line 第一次 read时 返回的是  ids 数组.
# 2.2 需要 子模型 再次  read 一次数据
# 3. onchange 接口。参数是  编辑的字段名, value1
# 3.1 onchange 返回值为 新的 value，更新  value1 和 value2
# 3.2 父表的 onchange 参数 value 中注意 子表的数据格式
# 3.3 子表的 onchange 参数 value 中注意 父表的数据格式
# 4. 父表的 write 或者 create。参数是 value2
# 4.1 注意 参数 value2 中, 子表的数据格式
#
# 前端工作
#
#

from odoorpc import rpc

model = 'sale.order'

# 在 这里, 列出所有前端 需要的字段
fields = ['name', 'partner_id', 'user_id']


def test_so_fields_get():
    # 获取所有字段, 以及字段的类型

    Model = rpc.env.model(model)

    attributes = [
        'type',  # 类型
        'name',  # 字段名
        'string',  # 中文名
        'store',  # 在数据库中有存储
        'related',  # 通过其他m2o字段 关联到的字段
        'relation',  # 关联模型
        'relation_field',  # type=one2many 字段的 关联模型中的字段名
        'required',  # 必填
        'readonly',  # 只读
        'selection',  # type=selection 字段的 可选项
    ]
    res = Model.fields_get([], attributes)
    print('test_so_fields_get', res)
